﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using AcadPos.Entity;
using TrustX.Dados;
using System.Data.SqlClient;

namespace AcadPos.Data
{
    public class DBCurso
    {
        #region Inserir
        public bool inserir(Curso curso, string usuario)
        {
            string SQL = @"INSERT INTO TB_CURSO
                                  (
                                    ID_AREA_CONHECIMENTO,
                                    DESCRICAO,
                                    DESCRICAO_ABREVIADA,
                                    DATA_RECONHECIMENTO,
                                    RECONHECIMENTO,
                                    SITUACAO,
                                    DATA_CADASTRO
                                  )
                                VALUES
                                  (
                                    @ID_AREA_CONHECIMENTO,
                                    UPPER(@DESCRICAO),
                                    UPPER(@DESCRICAO_ABREVIADA),
                                    @DATA_RECONHECIMENTO,
                                    @RECONHECIMENTO,
                                    @SITUACAO,
                                    GETDATE()
                                  )";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
            db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
            db.AddParam("@DESCRICAO_ABREVIADA", SqlDbType.VarChar, curso.DescricaoAbreviada);
            db.AddParam("@DATA_RECONHECIMENTO", SqlDbType.DateTime, curso.DtReconhecimento);
            db.AddParam("@RECONHECIMENTO", SqlDbType.VarChar, curso.Reconhecimento);
            db.AddParam("@SITUACAO", SqlDbType.VarChar, curso.Situacao);
            //return db.ExecuteNonQuery();

            bool inseriu = db.ExecuteNonQuery();

            if (inseriu)
            {
                SQL = @"INSERT INTO TB_AUDITORIA
                                  (
                                    ACAO,
                                    TABELA,
                                    DESCRICAO,
                                    USUARIO,
                                    DATA                                    
                                  )
                                VALUES
                                  (                                  	
                                    'INSERT',
                                    'TB_CURSO',
                                    ((SELECT CAST(MAX(ID_CURSO) AS VARCHAR) FROM TB_CURSO)
                                    + ' | ' + CAST(@ID_AREA_CONHECIMENTO AS VARCHAR) 
                                    + ' | ' + @DESCRICAO
                                    + ' | ' + UPPER(@SITUACAO)),
                                    UPPER(@USUARIO),
                                    GETDATE()
                                  )";

                db = new DataAccess(SQL);
                db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
                db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
                db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
                db.AddParam("@SITUACAO", SqlDbType.VarChar, curso.Situacao);
                db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);
            }
            db.ExecuteNonQuery();
            return inseriu;
        }
        #endregion

        #region Inserir no Log de Auditoria
        public object inserirLogAuditoria(Curso curso, string usuario)
        {
            string SQL = @"INSERT INTO TB_AUDITORIA
                                  (
                                    ACAO,
                                    TABELA,
                                    DESCRICAO,
                                    USUARIO,
                                    DATA                                    
                                  )
                                VALUES
                                  (                                  	
                                    'INSERT',
                                    'TB_CURSO',
                                    (SELECT
                                    ((SELECT CAST(MAX(ID_CURSO) AS VARCHAR) FROM TB_CURSO)
                                    + ' | ' + CAST(@ID_AREA_CONHECIMENTO AS VARCHAR)  
                                    + ' | ' + CAST(@DESCRICAO' AS VARCHAR) 
                                    + ' | ' + CAST(@DESCRICAO_ABREVIADA AS  VARCHAR)
                                    + ' | ' + CAST(@DATA_RECONHECIMENTO AS VARCHAR) 
                                    + ' | ' + CAST(@RECONHECIMENTO AS VARCHAR)
                                    + ' | ' + CAST(@SITUACAO' AS VARCHAR))
                                     AS DESCRICAO),
                                    @USUARIO,
                                    GETDATE()
                                  )";

            DataAccess db = new DataAccess(SQL);
            //db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
            db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
            db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
            db.AddParam("@DESCRICAO_ABREVIADA", SqlDbType.VarChar, curso.DescricaoAbreviada);
            db.AddParam("@DATA_RECONHECIMENTO", SqlDbType.DateTime, curso.DtReconhecimento);
            db.AddParam("@RECONHECIMENTO", SqlDbType.VarChar, curso.Reconhecimento);
            db.AddParam("@SITUACAO", SqlDbType.VarChar, curso.Situacao);
            db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);

            return (db.ExecuteNonQuery());
            
        }
        #endregion

        #region Alterar
        public bool alterar(Curso curso, string usuario)
        {
            string SQL = @"UPDATE  TB_CURSO
                                    SET    ID_AREA_CONHECIMENTO = @ID_AREA_CONHECIMENTO,
                                           DESCRICAO = UPPER(@DESCRICAO),                                    
                                           DESCRICAO_ABREVIADA = UPPER(@DESCRICAO_ABREVIADA),
                                           DATA_RECONHECIMENTO = @DATA_RECONHECIMENTO,
                                           RECONHECIMENTO = @RECONHECIMENTO,
                                           SITUACAO = @SITUACAO
                                    WHERE  ID_CURSO = @ID_CURSO";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
            db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
            db.AddParam("@DESCRICAO_ABREVIADA", SqlDbType.VarChar, curso.DescricaoAbreviada);
            db.AddParam("@DATA_RECONHECIMENTO", SqlDbType.DateTime, curso.DtReconhecimento);
            db.AddParam("@RECONHECIMENTO", SqlDbType.VarChar, curso.Reconhecimento);
            db.AddParam("@SITUACAO", SqlDbType.VarChar, curso.Situacao);
            db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
            //return db.ExecuteNonQuery();

            bool atualizou = db.ExecuteNonQuery();

            if (atualizou)
            {
                SQL = @"INSERT INTO TB_AUDITORIA
                                  (
                                    ACAO,
                                    TABELA,
                                    DESCRICAO,
                                    USUARIO,
                                    DATA                                    
                                  )
                                VALUES
                                  (                                  	
                                    'UPDATE',
                                    'TB_CURSO',
                                    (CAST(@ID_CURSO AS VARCHAR)
                                    + ' | ' + CAST(@ID_AREA_CONHECIMENTO AS VARCHAR) 
                                    + ' | ' + @DESCRICAO
                                    + ' | ' + UPPER(@SITUACAO)),
                                    UPPER(@USUARIO),
                                    GETDATE()
                                  )";

                db = new DataAccess(SQL);
                db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
                db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
                db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
                db.AddParam("@SITUACAO", SqlDbType.VarChar, curso.Situacao);
                db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);
            }
            
            db.ExecuteNonQuery();
            return atualizou;
        }
        #endregion

        #region Excluir
        public bool excluir(Curso curso, string usuario)
        {
            string SQL = @"DELETE 
                    FROM   TB_CURSO
                    WHERE  ID_CURSO = @ID_CURSO";

            DataAccess db = new DataAccess(SQL);           
            db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
            //return db.ExecuteNonQuery();

            bool excluiu = db.ExecuteNonQuery();

            if (excluiu)
            {
                SQL = @"INSERT INTO TB_AUDITORIA
                                  (
                                    ACAO,
                                    TABELA,
                                    DESCRICAO,
                                    USUARIO,
                                    DATA                                    
                                  )
                                VALUES
                                  (                                  	
                                    'DELETE',
                                    'TB_CURSO',
                                    (CAST(@ID_CURSO AS VARCHAR)
                                    + ' | ' + CAST(@ID_AREA_CONHECIMENTO AS VARCHAR) 
                                    + ' | ' + @DESCRICAO
                                    + ' | ' + UPPER(@SITUACAO)),
                                    UPPER(@USUARIO),
                                    GETDATE()
                                  )";

                db = new DataAccess(SQL);
                db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
                db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
                db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
                db.AddParam("@SITUACAO", SqlDbType.VarChar, curso.Situacao);
                db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);
            }

            db.ExecuteNonQuery();
            return excluiu;
        }
        #endregion

        #region Listar Cursos
        public DataTable listarCursos(Curso curso)
        {
            string SQL = @"SELECT  tc.ID_CURSO,
                                   tc.ID_AREA_CONHECIMENTO,
                                   tc.DESCRICAO,
                                   tc.DATA_RECONHECIMENTO,
                                   tc.DESCRICAO_ABREVIADA,
                                   tc.RECONHECIMENTO,
                                   tc.SITUACAO
                            FROM   TB_CURSO tc
                                   INNER JOIN TB_AREA_CONHECIMENTO tac
                                        ON  tac.ID_AREA_CONHECIMENTO = tc.ID_AREA_CONHECIMENTO
                            WHERE  UPPER(tc.DESCRICAO) LIKE '%' + UPPER(@DESCRICAO) + '%'
                                   AND (tc.ID_AREA_CONHECIMENTO = @ID_AREA_CONHECIMENTO OR 0 = @ID_AREA_CONHECIMENTO)
                            ORDER BY tc.DESCRICAO ";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
            db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
            return db.GetDataTable();
        }
        #endregion

        #region Verificar Curso
        public DataTable cursoJaExiste(Curso curso)
        {
            string SQL = @"SELECT  tc.ID_CURSO,
                           tc.ID_AREA_CONHECIMENTO
                          
                    FROM   TB_CURSO tc
                           INNER JOIN TB_AREA_CONHECIMENTO tac
                                ON  tac.ID_AREA_CONHECIMENTO = tc.ID_AREA_CONHECIMENTO
                    WHERE  UPPER(tc.DESCRICAO) = UPPER(@DESCRICAO)
                           AND tc.ID_AREA_CONHECIMENTO = @ID_AREA_CONHECIMENTO";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_AREA_CONHECIMENTO", SqlDbType.Int, curso.IdAreaConhecimento);
            db.AddParam("@DESCRICAO", SqlDbType.VarChar, curso.Descricao);
            return db.GetDataTable();
        }
        #endregion

        #region Retornar Curso
        public Curso retornarCurso(Curso curso)
        {
            // Adicionado mais uma coluna CH_TOTAL_CURSO (05-05-2015) 
            string SQL = @"SELECT  tc.ID_CURSO,
                                   tc.ID_AREA_CONHECIMENTO,
                                   tc.DESCRICAO,
                                   tc.DATA_RECONHECIMENTO,
                                   tc.DESCRICAO_ABREVIADA,
                                   tc.RECONHECIMENTO,
                                   tc.SITUACAO
                            FROM   TB_CURSO tc
                                   INNER JOIN TB_AREA_CONHECIMENTO tac
                                        ON  tac.ID_AREA_CONHECIMENTO = tc.ID_AREA_CONHECIMENTO
                            WHERE  tc.ID_CURSO = @ID_CURSO";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_CURSO", SqlDbType.Int, curso.IdCurso);
            try
            {
                db.AbrirConexao();
                SqlDataReader dr = db.ExecuteReader();
                if (dr.Read())
                {
                    curso.IdCurso = Convert.ToInt32(dr["ID_CURSO"].ToString());
                    curso.IdAreaConhecimento = Convert.ToInt32(dr["ID_AREA_CONHECIMENTO"].ToString());
                    curso.Descricao = dr["DESCRICAO"].ToString();
                    curso.DtReconhecimento = Convert.ToDateTime(dr["DATA_RECONHECIMENTO"].ToString());
                    curso.DescricaoAbreviada = dr["DESCRICAO_ABREVIADA"].ToString();
                    curso.Reconhecimento = dr["RECONHECIMENTO"].ToString();
                    curso.Situacao = dr["SITUACAO"].ToString();                                       
                }
                return curso;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                db.FecharConexao();
            }
        }
        #endregion

        #region Carga Horaria Total do Curso
        public int cargaHorariaCurso(int idCurso)
        {
            string SQL = @"(SELECT SUM(CH_DISCIPLINA) 
                                FROM TB_MATRIZ_CURRICULAR TMAC
                                    LEFT JOIN TB_MODULO_CURRICULO TMOC ON (TMAC.ID_MODULO_CURRICULO = TMOC.ID_MODULO_CURRICULO)
                                    LEFT JOIN TB_CURRICULO TCUR ON (TMOC.ID_CURRICULO = TCUR.ID_CURRICULO)
                                    LEFT JOIN TB_CURSO TCO ON (TCUR.ID_CURSO = TCO.ID_CURSO)
                                        WHERE TCO.ID_CURSO = @ID_CURSO)";
            
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_CURSO", SqlDbType.Int, idCurso);
            
            return (int)db.ExecuteScalar();
        }
        #endregion
    }
}
